package com.study.www.config.fastjson;

import com.alibaba.fastjson.parser.ParserConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Import;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
/**
 * 重写Redis序列化方式，使用 自定义的 FastJsonRedisSerializer:
 * 当我们的数据存储到Redis的时候，我们的键（key）和值（value）都是通过Spring提供的Serializer序列化到数据库的。
 * RedisTemplate默认使用的是 JdkSerializationRedisSerializer，StringRedisTemplate默认使用的是 StringRedisSerializer。
 * Spring Data JPA为我们提供了下面的Serializer：
 * GenericJackson2JsonRedisSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
 * 在此我们将自己配置RedisTemplate并定义Serializer。
 * @author : Administrator.zhuyanpeng
 * @date : 2019/10/16 - 17:38
 */
@Component
// 先去配置文件读取 redis 相关的配置不然会导致  RedisConnectionFactory (LettuceConnectionFactory) 链接为空的
@AutoConfigureAfter(RedisAutoConfiguration.class)
@Import({RedisAutoConfiguration.class})
@Slf4j
public class FastJsonRedisTemplate extends RedisTemplate<String, Object> {

    public FastJsonRedisTemplate(@Value("#{'${IP.white.list}'.split(',')}") List<String> ipWhiteList,
                                 @Autowired() LettuceConnectionFactory lettuceConnectionFactory) {
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 指定 fastJson 白名单
        ipWhiteList.stream().forEach(ipWhite -> ParserConfig.getGlobalInstance().addAccept(ipWhite));
        //指定包解析
        ParserConfig.getGlobalInstance().addAccept("com.study.www");
        setConnectionFactory(lettuceConnectionFactory);
        afterPropertiesSet();
        // key 直接使用 StringRedisSerializer 其无需复杂格式
        setKeySerializer(stringRedisSerializer);
        setHashKeySerializer(stringRedisSerializer);
        setValueSerializer(fastJsonRedisSerializer);
        setHashValueSerializer(fastJsonRedisSerializer);
        logger.warn("the Lettuce-fastjson starting success,date is -->"+ new Date());
    }
}